
local mt = {val=1}
local set = {__add=function(mytable,val)
    print(mytable.val,val)
    return mytable.val + val
end,__tostring=function(mytable)
    return mytable.val
end}
setmetatable(mt,set)
print(mt)
print(getmetatable(mt))
print(mt + 8);
mt.__mul = function(mytable)
    print(mytable)
end
mt.__le = function(a,b) 
    for k in pair(a) do 
        if not b[k] then
            return false
        end
        return true
    end
end
mt.__lt = function(a,b)
    return a <= b and not (b <= a)
end
print(getmetatable(mt))

-- __pairs 对象遍历
--[[
    函数setmetatable和getmetatable也用到了元方法，用于保护元表。假设想要保护我们的集合，
    就要使用户既不能看到也不能修改集合的元表。
    如果在元表中设置__metatable字段，那么getmetatable会返回这个字段的值，而setmetatable则会引发一个错误：
]]
-- Account = {}
-- function Account:new(o)
--     o = o or {}
--     self.__index = self
--     setmetatable(o,self)
--     return o
-- end